home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / sox.zip / MISC.C < prev    next >
C/C++ Source or Header  |  1992-06-15  |  5KB  |  260 lines

  1. /*
  2.  * July 5, 1991
  3.  * Copyright 1991 Lance Norskog And Sundry Contributors
  4.  * This source code is freely redistributable and may be used for
  5.  * any purpose.  This copyright notice must be maintained. 
  6.  * Lance Norskog And Sundry Contributors are not responsible for 
  7.  * the consequences of using this software.
  8.  */
  9.  
  10. /*
  11.  * Sound Tools miscellaneous stuff.
  12.  */
  13.  
  14. char *sizes[] = {
  15.     "NONSENSE!",
  16.     "bytes",
  17.     "shorts",
  18.     "longs",
  19.     "32-bit floats",
  20.     "64-bit floats",
  21.     "IEEE floats"
  22. };
  23.  
  24. char *styles[] = {
  25.     "NONSENSE!",
  26.     "unsigned",
  27.     "signed (2's complement)",
  28.     "u-law",
  29.     "a-law"
  30. };
  31.  
  32. char readerr[] = "Premature EOF while reading sample file.";
  33. char writerr[] = "Error writing sample file.  You are probably out of disk space.";
  34.  
  35. #include "st.h"
  36.  
  37. /* Utilities */
  38.  
  39. /* Read short, little-endian: little end first. VAX/386 style. */
  40. unsigned short
  41. rlshort(ft)
  42. ft_t ft;
  43. {
  44.     unsigned char uc, uc2;
  45.     uc  = getc(ft->fp);
  46.     uc2 = getc(ft->fp);
  47.     return (uc2 << 8) | uc;
  48. }
  49.  
  50. /* Read short, bigendian: big first. 68000/SPARC style. */
  51. unsigned short
  52. rbshort(ft)
  53. ft_t ft;
  54. {
  55.     unsigned char uc, uc2;
  56.     uc2 = getc(ft->fp);
  57.     uc  = getc(ft->fp);
  58.     return (uc2 << 8) | uc;
  59. }
  60.  
  61. /* Write short, little-endian: little end first. VAX/386 style. */
  62. unsigned short
  63. wlshort(ft, us)
  64. ft_t ft;
  65. unsigned int us;
  66. {
  67.     putc(us, ft->fp);
  68.     putc(us >> 8, ft->fp);
  69.     if (ferror(ft->fp))
  70.         fail(writerr);
  71. }
  72.  
  73. /* Write short, big-endian: big end first. 68000/SPARC style. */
  74. unsigned short
  75. wbshort(ft, us)
  76. ft_t ft;
  77. unsigned int us;
  78. {
  79.     putc(us >> 8, ft->fp);
  80.     putc(us, ft->fp);
  81.     if (ferror(ft->fp))
  82.         fail(writerr);
  83. }
  84.  
  85. /* Read long, little-endian: little end first. VAX/386 style. */
  86. unsigned long
  87. rllong(ft)
  88. ft_t ft;
  89. {
  90.     unsigned char uc, uc2, uc3, uc4;
  91. /*    if (feof(ft->fp))
  92.         fail(readerr);        /* No worky! */
  93.     uc  = getc(ft->fp);
  94.     uc2 = getc(ft->fp);
  95.     uc3 = getc(ft->fp);
  96.     uc4 = getc(ft->fp);
  97.     return ((long)uc4 << 24) | ((long)uc3 << 16) | ((long)uc2 << 8) | (long)uc;
  98. }
  99.  
  100. /* Read long, bigendian: big first. 68000/SPARC style. */
  101. unsigned long
  102. rblong(ft)
  103. ft_t ft;
  104. {
  105.     unsigned char uc, uc2, uc3, uc4;
  106. /*    if (feof(ft->fp))
  107.         fail(readerr);        /* No worky! */
  108.     uc  = getc(ft->fp);
  109.     uc2 = getc(ft->fp);
  110.     uc3 = getc(ft->fp);
  111.     uc4 = getc(ft->fp);
  112.     return ((long)uc << 24) | ((long)uc2 << 16) | ((long)uc3 << 8) | (long)uc4;
  113. }
  114.  
  115. /* Write long, little-endian: little end first. VAX/386 style. */
  116. unsigned long
  117. wllong(ft, ul)
  118. ft_t ft;
  119. unsigned long ul;
  120. {
  121. int datum;
  122.  
  123.     datum = (ul) & 0xff;
  124.     putc(datum, ft->fp);
  125.     datum = (ul >> 8) & 0xff;
  126.     putc(datum, ft->fp);
  127.     datum = (ul >> 16) & 0xff;
  128.     putc(datum, ft->fp);
  129.     datum = (ul >> 24) & 0xff;
  130.     putc(datum, ft->fp);
  131.     if (ferror(ft->fp))
  132.         fail(writerr);
  133. }
  134.  
  135. /* Write long, big-endian: big end first. 68000/SPARC style. */
  136. unsigned long
  137. wblong(ft, ul)
  138. ft_t ft;
  139. unsigned long ul;
  140. {
  141. int datum;
  142.  
  143.     datum = (ul >> 24) & 0xff;
  144.     putc(datum, ft->fp);
  145.     datum = (ul >> 16) & 0xff;
  146.     putc(datum, ft->fp);
  147.     datum = (ul >> 8) & 0xff;
  148.     putc(datum, ft->fp);
  149.     datum = (ul) & 0xff;
  150.     putc(datum, ft->fp);
  151.     if (ferror(ft->fp))
  152.         fail(writerr);
  153. }
  154.  
  155. /* Read and write words and longs in "machine format".  Swap if indicated. */
  156.  
  157. /* Read short. */
  158. unsigned short
  159. rshort(ft)
  160. ft_t ft;
  161. {
  162.     unsigned short us;
  163.  
  164. /*    if (feof(ft->fp))
  165.         fail(readerr);        /* No worky! */
  166.     fread(&us, 2, 1, ft->fp);
  167.     if (ft->swap)
  168.         us = swapw(us);
  169.     return us;
  170. }
  171.  
  172. /* Write short. */
  173. unsigned short
  174. wshort(ft, ui)
  175. ft_t ft;
  176. unsigned int ui;
  177. {
  178.     unsigned short us;
  179.     us = ui;
  180.     if (ft->swap)
  181.         us = swapw(us);
  182.     if (fwrite(&us, 2, 1, ft->fp) != 1)
  183.         fail(writerr);
  184. }
  185.  
  186. /* Read long. */
  187. unsigned long
  188. rlong(ft)
  189. ft_t ft;
  190. {
  191.     unsigned long ul;
  192.  
  193. /*    if (feof(ft->fp))
  194.         fail(readerr);        /* No worky! */
  195.     fread(&ul, 4, 1, ft->fp);
  196.     if (ft->swap)
  197.         ul = swapl(ul);
  198.     return ul;
  199. }
  200.  
  201. /* Write long. */
  202. unsigned long
  203. wlong(ft, ul)
  204. ft_t ft;
  205. unsigned long ul;
  206. {
  207.     if (ft->swap)
  208.         ul = swapl(ul);
  209.     if (fwrite(&ul, 4, 1, ft->fp) != 1)
  210.         fail(writerr);
  211. }
  212.  
  213. /* Byte swappers */
  214.  
  215. unsigned short
  216. swapw(us)
  217. unsigned int us;
  218. {
  219.     return ((us >> 8) | (us << 8)) & 0xffff;
  220. }
  221.  
  222. unsigned long
  223. swapl(ul)
  224. unsigned long ul;
  225. {
  226.     return (ul >> 24) | ((ul >> 8) & 0xff00) | ((ul << 8) & 0xff0000) | (ul << 24);
  227. }
  228.  
  229. /* dummy routine for do-nothing functions */
  230. int nothing() {;}
  231.  
  232. /* dummy drain routine for effects */
  233. null_drain(effp, obuf, osamp)
  234. eff_t effp;
  235. long *obuf;
  236. long *osamp;
  237. {
  238.     *osamp = 0;
  239. }
  240.  
  241. /* here for linear interp.  might be useful for other things */
  242. gcd(a, b) 
  243. long a, b;
  244. {
  245.     if (b == 0)
  246.         return a;
  247.     else
  248.         return gcd(b, a % b);
  249. }
  250.  
  251. lcm(a, b) 
  252. long a, b;
  253. {
  254.     int m;
  255.  
  256.     return (a * b) / gcd(a, b);
  257. }
  258.  
  259. /* sine wave gen should be here, also */
  260.